package tpenchere.dao.impl;

import java.util.Date;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import tpenchere.model.Categorie;
import tpenchere.model.Enchere;
import tpenchere.model.Produit;
import tpenchere.model.User;

@SuppressWarnings("unchecked")
public class EnchereDAOJpa implements EnchereDAO {

	@PersistenceContext
	public EntityManager em;

	/*
	 * (non-Javadoc)
	 * 
	 * @see tpenchere.dao.impl.EnchereDAO#getAll()
	 */
	public List<Enchere> getAll() {
		return em.createQuery("from Enchere").getResultList();
	}

	public Categorie createCategorie(Categorie cat) {
		em.persist(cat);
		return getCategorie(cat.nom);
	}

	public Categorie getCategorie(String nom) {
		Query q = em.createQuery("from Categorie c where c.nom = :nom");
		q.setParameter("nom", nom);
		List l = q.getResultList();
		return l.isEmpty() ? null : (Categorie) l.get(0);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see tpenchere.dao.impl.EnchereDAO#createEnchere(tpenchere.model.Enchere)
	 */
	public Enchere createEnchere(Enchere enchere) {
		em.persist(enchere);
		return getEnchere(enchere);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see tpenchere.dao.impl.EnchereDAO#getEnchere(tpenchere.model.Enchere)
	 */
	public Enchere getEnchere(Enchere enchere) {
		Query q = em
				.createQuery("from Enchere e where e.idProduit = :idProduit and e.pseudo = :pseudo");
		q.setParameter("idProduit", enchere.idProduit);
		q.setParameter("pseudo", enchere.pseudo);
		try {
			return (Enchere) q.getSingleResult();
		} catch (Exception e) {
			return null;
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see tpenchere.dao.impl.EnchereDAO#createUser(tpenchere.model.User)
	 */
	public User createUser(User user) {
		user.motDePasse = "password";
		em.persist(user);
		return connect(user.pseudo, user.motDePasse);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see tpenchere.dao.impl.EnchereDAO#createProduit(tpenchere.model.Produit)
	 */
	public Produit createProduit(Produit produit) {
		Produit p = this.getProduit(produit);
		if (p != null) {
			p.prixImmediat = produit.prixImmediat;
			em.persist(p);			
			return p;
		}
		Categorie c = this.getCategorie(produit.categorie.nom);
		if(c == null) {
			produit.categorie = this.createCategorie(produit.categorie);
		} else {
			produit.categorie = c;
		}
		em.persist(produit);
		return getProduit(produit);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see tpenchere.dao.impl.EnchereDAO#getProduit(tpenchere.model.Produit)
	 */
	public Produit getProduit(Produit produit) {
		Query q = em
				.createQuery("from Produit e where e.libelle = :libelle and e.pseudoVendeur = :pseudoVendeur");
		q.setParameter("libelle", produit.libelle);
		q.setParameter("pseudoVendeur", produit.pseudoVendeur);
		List l = q.getResultList();
		return l.isEmpty() ? null : (Produit) l.get(0);
	}
	
	public Produit getProduit(int idProduit) {
		Query q = em
				.createQuery("from Produit e where e.idProduit = :id");
		q.setParameter("id", idProduit);
		Produit p = (Produit) q.getSingleResult();
		return p;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see tpenchere.dao.impl.EnchereDAO#connect(java.lang.String,
	 * java.lang.String)
	 */
	public User connect(String login, String password) {
		Query q = em.createQuery("from User  where pseudo like :pseudo and motDePasse like :motDePasse");// and
																			// motDePasse
																			// like
																			// :motDePasse
		q.setParameter("pseudo", login);
		q.setParameter("motDePasse", password);
		User user = (User) q.getSingleResult();
		if (password.equals(user.motDePasse))
			return user;
		throw new IllegalArgumentException("not " + password + " = "
				+ user.motDePasse);
		// q.setParameter("motDePasse", password);

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see tpenchere.dao.impl.EnchereDAO#loginUsed(java.lang.String)
	 */
	public boolean loginUsed(String login) {
		Query q = em.createQuery("from User  where pseudo like :pseudo");
		q.setParameter("pseudo", login);
		return q.getResultList().size() > 0;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see tpenchere.dao.impl.EnchereDAO#getCurrentProduct()
	 */
	public List<Produit> getCurrentProduct() {
		Query q = em.createQuery("from Produit p where p.echeance >= :date");
		q.setParameter("date", new Date().getTime());
		List<Produit> p = q.getResultList();
		return p;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see tpenchere.dao.impl.EnchereDAO#getProductSold()
	 */
	public List<Produit> getProductSold() {
		List<Produit> p = em.createQuery("from Produit").getResultList();
		return p;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * tpenchere.dao.impl.EnchereDAO#getProductBy(tpenchere.model.Categorie)
	 */
	public List<Produit> getProductBy(Categorie categorie) {
		List<Produit> p = em.createQuery("from Produit").getResultList();
		return p;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see tpenchere.dao.impl.EnchereDAO#getEnchere(tpenchere.model.Produit)
	 */
	public List<Enchere> getEnchere(Produit produit) {
		if (produit.idProduit == 0) {
			return null;
		}
		Query q = em
				.createQuery("from Enchere e where e.idProduit = :idProduit");
		q.setParameter("idProduit", produit.idProduit);

		return q.getResultList();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see tpenchere.dao.impl.EnchereDAO#getAllRootCategorie()
	 */
	public List<Categorie> getAllRootCategorie() {
		List<Categorie> p = em.createQuery("from Categorie").getResultList();
		return p;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see tpenchere.dao.impl.EnchereDAO#getAllRootCategorie()
	 */
	public Categorie getCategorie(Categorie c) {
		if (c.idCategorie == 0) {
			return null;
		}
		Query q = em
				.createQuery("from Categorie c where c.idCategorie = :idCategorie");
		q.setParameter("idCategorie", c.idCategorie);
		Categorie p = (Categorie) q.getSingleResult();
		return p;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see tpenchere.dao.impl.EnchereDAO#getAllProduct()
	 */
	public List<Produit> getAllProduct() {
		List<Produit> p = em.createQuery("from Produit").getResultList();
		return p;
	}

}
